const Todos = require('../models/todo');
const NotFound = require('../errors/NotFoundError');
const BadRequest = require('../errors/badReques');
const Forbidden = require('../errors/ForbiddenError');
const User = require('../models/user')
const Conflicted = require('../errors/conflicted')

const getTodos = (req, res, next) => {
  Todos.find({ owner: req.user._id })
    .then((todos) => {
      res.send(todos);
    })
    .catch(next);
};

const createTodo = (req, res, next) => {
  const {
    groupId,
    title,
    startTime,
    endTime,
    checked
  } = req.body;
  Todos.create({
    groupId,
    title,
    startTime,
    endTime,
    checked,
    user: req.user._id,
  })
    .then((todo) => res.send(todo))
    .catch((evt) => {
      if (evt.name === 'ValidationError') {
        next(
          new BadRequest(
            'Переданы некорректные данные при создании задания',
          ),
        );
      } else {
        next(evt);
      }
    });
};

const deleteTodo = (req, res, next) => {
  Todos.findById(req.params.movieId)
    .orFail(() => {
      throw new NotFound('Задание с указанным _id не найден');
    })
    .then((todo) => {
      const user = todo.user.toString();
      if (req.user._id === user) {
        Todos.deleteOne(todo)
          .then(() => {
            res.send(todo);
          })
          .catch(next);
      } else {
        throw new Forbidden('Невозможно удалить задание');
      }
    })
    .catch((evt) => {
      if (evt.name === 'CastError') {
        next(new BadRequest('Переданы некорректные данные удаления'));
      } else {
        next(evt);
      }
    });
};

const updateTodo = (req, res, next) => {
  const {
    groupId,
    title,
    startTime,
    endTime,
    checked
  } = req.body;
  Todos.findByIdAndUpdate(
    req.user._id,
    {
      groupId,
      title,
      startTime,
      endTime,
      checked
    },
    {
      new: true,
      runValidators: true,
    },
  )
    .orFail(() => {
      throw new NotFound('Пользователь с указанным _id не найден');
    })
    .then((todo) => {
      res.send(todo);
    })
    .catch((evt) => {
      if (evt.code === 11000) {
        next(new Conflicted('Такое задание уже существует'));
      } else if (evt.name === 'ValidationError') {
        next(new BadRequest('Переданы некорректные данные при обновлении задания'));
      } else {
        next(evt);
      }
    });
};

module.exports = { getTodos, createTodo, deleteTodo, updateTodo };
